//
//  YHRuntimeVC.m
//  LyhToolsTest
//
//  Created by LYH on 2019/1/2.
//  Copyright © 2019年 LYH.com. All rights reserved.
//

#import "YHRuntimeVC.h"
#import "YHPerson.h"
#import "YHPerson+Extention.h"
/**使用Runtime相关Api*/
#import <objc/message.h> //向对象发送消息的函数
#import <objc/runtime.h>//运行时最重要的文件，包含对运行时进行操作的方法

@interface YHRuntimeVC ()

@end

@implementation YHRuntimeVC

- (void)viewDidLoad {
    [super viewDidLoad];
    [self initnavabar];
}
-(void)initnavabar
{
    WeakSelf;
    wself.ts_navgationBar = [TSNavigationBar navWithTitle:@"runtime 应用" backAction:^{
        [self.navigationController popViewControllerAnimated:YES];
    }];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    
    [self Addproperty];
}
/**1 发送消息
 *方法调用的本质，就是让对象发送消息。
 objc_msgSend,只有对象才能发送消息，因此以objc开头.
 使用消息机制前提，必须导入#import <objc/message.h>
 */
- (void)objc_msgsendTest
{
    YHPerson *p = [[YHPerson alloc]init];
    //调用对象方法
    [p drink];
    //本质：让对象发送消息
//    objc_msgSend(p, @selector(drink));
//    [[YHPerson alloc] drink];
    
    objc_msgSend([YHPerson alloc], @selector(drink));
}
/**
 *2. 交换方法 见UIImage+Extension
 */
- (void)method_exchangeTest
{
    UIImage *image = [UIImage imageNamed:@"hjagfhaj"];
}
/**
 *3.动态添加属性
 */
- (void)Addproperty
{
    YHPerson *p = [[YHPerson alloc]init];
    p.name  = @"我动态添加了属性name";
    NSLog(@"%@",p.name);
}
/**
 *4. 动态添加方法
 *performSelector
 */
- (void)objc_performSelectorTest
{
    YHPerson *p = [[YHPerson alloc]init];
    
    [p performSelector:@selector(eat)];
}

@end
